
//写个数组类，有有参构造，无参构造，析构函数，有接口可以读写访问第idx个数组元素。有show函数遍历整个数组。

#include <iostream>
using namespace std;

class MyArray {
private:
    int* data;      // 数组数据指针
    int size;       // 数组大小

public:
    // 无参构造（默认大小为10）
    MyArray() : size(10) {
        data = new int[size];
        for (int i = 0; i < size; ++i) {
            data[i] = 0;  // 初始化为0
        }
        cout << "无参构造创建数组，大小=" << size << endl;
    }

    // 有参构造
    MyArray(int n) : size(n) {
        if (n <= 0) {
            size = 10;  // 默认大小
            cout << "输入大小不合法，使用默认大小=" << size << endl;
        }
        data = new int[size];
        for (int i = 0; i < size; ++i) {
            data[i] = 0;  // 初始化为0
        }
        cout << "有参构造创建数组，大小=" << size << endl;
    }

    // 析构函数
    ~MyArray() {
        delete[] data;  // 释放内存
        cout << "析构函数释放数组，大小=" << size << endl;
    }

    // 获取数组大小
    int getSize() const {
        return size;
    }

    // 读写访问第idx个元素（非const版本，可修改）
    int& operator[](int idx) {
        if (idx < 0 || idx >= size) {
            cerr << "数组越界，idx=" << idx << "，但size=" << size << endl;
            throw out_of_range("数组越界");
        }
        return data[idx];
    }

    // 只读访问第idx个元素（const版本）
    const int& operator[](int idx) const {
        if (idx < 0 || idx >= size) {
            cerr << "数组越界，idx=" << idx << "，但size=" << size << endl;
            throw out_of_range("数组越界");
        }
        return data[idx];
    }

    // 遍历打印数组
    void show() const {
        cout << "数组内容（size=" << size << "）：";
        for (int i = 0; i < size; ++i) {
            cout << data[i] << " ";
        }
        cout << endl;
    }
};

int main() {
    // 测试无参构造
    MyArray arr1;
    arr1.show();

    // 测试有参构造
    MyArray arr2(5);
    arr2[0] = 10;  // 写操作
    arr2[1] = 20;
    arr2.show();

    // 测试读写访问
    cout << "arr2[1]=" << arr2[1] << endl;  // 读操作
    arr2[1] = 100;                          // 写操作
    arr2.show();

    // 测试越界访问（会抛出异常）
    try {
        cout << arr2[10] << endl;  // 越界
    } catch (const exception& e) {
        cerr << "捕获异常：" << e.what() << endl;
    }

    return 0;
}